A análise de conteúdo possui grande relevância para as ciências sociais. Contudo, sua abordagem manual sempre limitou o volume de documentos sob análise. São raros os projetos que analisam grandes bases de dados.
O avanço tecnológico e científico permitiu que técnicas automatizadas de análise de conteúdo fossem desenvolvidas e aplicadas de forma simples a grandes acervos.
“automated content methods are incorrect models of language”
— (Grimmer and Stewart 2013, 2)
Todos os modelos quantitativos de análise de conteúdo estão errados, mas alguns são úteis;
Métodos quantitativos de análise de conteúdo amplificam a capacidade humana, mas não a substitui;
Não há um método global para a análise automatizada de conteúdo;
Validar, validar, validar.
O processamento de linguagem natural (NLP) é um subcampo da ciência da computação relacionado às interações entre computadores e a linguagem humana.
O R dispõe de uma série de pacotes dedicados a essa área e apresenta grande potencial ao conectar o processamento de linguagem natural a todo seu arcabouço de pacotes estatísticos.
Caracteres são representados por algum tipo de sistema de codificação (Wiki).
Exemplo: código Morse que codifica as letras do alfabeto latino e os numerais como sequências de pulsos elétricos de longa e curta duração. Outro exemplo é o sistema de codificação UTF-8, capaz de codificar todos os 1.112.064 pontos de código válidos em Unicode usando até 8 bits.
O R fornece funções para lidar com diferentes sistemas de codificação. Isso é útil se você lida com arquivos de texto que foram criados com outro sistema operacional e especialmente se o idioma não for o inglês e tiver muitos acentos e caracteres específicos.
Exemplo: o esquema de codificação padrão no Linux é UTF-8, enquanto o esquema de codificação padrão no Windows é Latin1.
A função Encoding() retorna a codificação de uma sequência de caracteres. Por sua vez, a função iconv() é usada para converter a codificação. Vejamos:
RChamamos uma sequência de caracteres de string. Três coisas são importantes de serem lembradas aqui:
RRPara declarar uma string, utilizamos aspas simples ' ou aspas dupla ".
R é case sensitiveO R diferencia letras maiúsculas de letras minúsculas. Se compararmos os dois objetos criados acima, temos:
# string
txt <- "uma string é uma sequência de caracteres"
txt <- 'também pode ser utilizada com aspas simples'
txt <- "no caso de aspas dupla, usa-se 'aspas simples' na string"
txt <- 'no caso de aspas simples, usa-se "aspas dupla" na string'
txt <- "para usar \"aspas dupla\" na string é necessário usar \\"
cat(txt) # vetor de caracteres com 5 strings vazias
palmeiras <- character(5)
palmeiras
# vejamos seu tamnho
length(palmeiras) # verificando o tamanho do vetor
# incluindo string no primeiro e terceiro elementos do vetor
palmeiras[1] <- "Quando surge o alviverde imponente"
palmeiras[3] <- "Sabe bem o que vem pela frente"
palmeirasnchar()nchar(c("Quantos", "caracteres?"))
nchar("Quantos caracteres?")
str_length(c("Quantos", "caracteres?"))toupper(), tolower()RVimos funções básicas e intermediárias para o processamento de sequências de caracteres no R. Para avançar, é necessário aprender o uso de expressões regulares (Regular Expressions).
Regular Expressions: uma expressão regular é um conjunto de símbolos que descreve um padrão de texto. Mais formalmente, uma expressão regular é um padrão que descreve um conjunto de cadeias de caracteres.
RO uso de expressões regulares pode se tornar uma tarefa realmente complexa. Veja esta discussão do StackOverflow a respeito de seu uso para identificação de endereços de e-mail, por exemplo.
# Para identificar o “.” de fato, usamos “\.”. Para poder usar a “\”, adicionamos mais uma e temos:
txt <- c("O Palmeiras é o time da virada", "o Palmeiras é o time do amor.")
str_detect(txt, "\\.")
# Para identificar a “\” de fato, usamos “\\”:
txt <- c("O Palmeiras é o time da virada \\ o Palmeiras é o time do amor.")
writeLines(txt)Por padrão, expressões regulares buscam por correspondência em qualquer parte de uma sequência de caracteres. Porém, é extremamente útil poder ancorar a busca pela correspondência no início ou no final de uma string. Podemos usar:
“^” para coincidir com o início da string.“$” para coincidir com o final da string.Utilizando o operador | (“OU”), desenvolva código que identifique os elementos do vetor abaixo que contêm as palavras presidencialismo e parlamentarismo:
Etapas para raspagem de dados na web:
É possível conhecer o código fonte de um site ao clicar com o botão direito do mouse no conteúdo da página.
Podemos facilmente obter o código fonte de um endereço na internet com o uso da função readLines.
Com base no exemplo que vimos, obtenha o código fonte da página do Chico Buarque na Wikipédia.
.pdf:No caso de textos em imagem é possível utilizar o optical character recognition (OCR). OCR é o processo de encontrar e reconhecer texto dentro de imagens, por exemplo, de uma captura de tela, texto digitalizado. A imagem abaixo tem um texto de exemplo:
Com o pacote Tesseract e o uso da Interface de Programação de Aplicativos (API) do Google é possível capturar seu conteúdo:
Utilizando a imagem do Tweet Fake atribuído ao Presidente Bolsonaro, obtenha seu conteúdo. Para tanto, é necessário instalar o acervo de treinamento em português com o seguinte comando tesseract_download('por').
twitteRAvançando um pouco mais, já seria possível comparar o uso de palavras por diferentes deputados. Vamos comparar os deputados do PSOL, PT e do PSDB.
A quantificação de texto pode ser feito através da análiseda frequência das palavras que compõem o documento. Logo, uma medida seria a frequência de um termo (tf) em um documento.
Contudo, há palavras que ocorrem muitas vezes, mas podem não ser importantes. Podemos removê-las antes da análise, mas é possível que algumas dessas palavras sejam mais importantes em alguns documentos do que em outros.
Uma alternativa seria examinar a frequência de documento inversa de um termo (idf), o que diminui o peso das palavras comumente usadas e aumenta o peso das palavras que não são muito usadas em uma coleção de documentos.
Combinando as duas alternativas, calcula-se o tf-idf de um termo. Em outras palavras, a frequência de um termo ajustada pela frequência com que é usado no acervo.
O pacote quanteda permite trabalhar com Tokens, Corpus e DFMs através do seguinte fluxograma:
corpus_subset()A função corpus_subset() permite selecionar documentos em um corpus com base em variáveis no nível do documento.
corpus_reshape()A função corpus_reshape() permite alterar a unidade de textos entre documentos, parágrafos e frases. Os textos podem ser restaurados para a unidade original mesmo que o corpus seja modificado por outras funções.
tokens()A função tokens() segmenta o texto.
kwic()A função dfm() constrói uma matriz de documentos e termos/palavras/stems/tokens/features (DFM) a partir de um objeto de tokens.
dfmat <- tokens(corp, remove_punct = TRUE, remove_numbers = T) %>%
tokens_select(pattern = stopwords(source = "stopwords-iso", language = "pt"),
selection = 'remove') %>%
dfm()
dfmat
ndoc(dfmat) # numero de documentos
nfeat(dfmat) # numero de features
head(docnames(dfmat), 20) # ids dos documentos
head(featnames(dfmat), 20) # algumas features
topfeatures(dfmat, 10) # features mais frequenteshead(docvars(dfmat_docfreq))
# por autor ----
dfmat_autor <- dfm(dfmat_docfreq, groups = "nomeOrador")
ndoc(dfmat_autor)
head(docvars(dfmat_autor))
# por partido ----
dfmat_party <- dfm(dfmat_docfreq, groups = "partido")
ndoc(dfmat_party)
docvars(dfmat_party)
# selecionando partidos
dfmat_party_pt <- dfm_subset(dfmat_party, subset = partido %in% c("PT"))Até aqui, mesmo que os procedimentos adotados tenham diminuído a dimensionalidade do acervo de documentos ao transformá-lo em uma sacola de palavras (bag of words), ainda é necessária a adoção de procedimentos que possam reduzir a complexidade do conteúdo a ser analisado.
Com esse objetivo, podemos pensar que determinado documento tenha em sua composição as seguintes palavras únicas: trabalho, trabalhador, trabalhista. Apesar de seus diferentes signficados, cada uma dessas palavras pode ser reduzida ao seu radical, trabalh, dando ao pequisador informações suficientes para sua análise e, assim reduzindo, o n de três palavras únicas para uma palavra que tem a soma das frequências anteriores.
Chamamos esse procediment de Stemming. O pacote quanteda possui a opção de stemming da DFM em português que usa o projeto Snowball através da função dfm_wordstem().
Vamos aplicar o stemming para produzir a dfm que nos será útil daqui em diante.
Uma comum da visualização de frequência na análise de texto é a nuvem de palavras.
A utilização da análise quantitativa de textos para a extração de posições políticas/ideológicas de partidos, políticos e eleitores é uma área extremamente promissora. O teste de modelos de competição partidária, por exemplo, depende do conhecimento das posições dos principais atores envolvidos no jogo político.
As duas técnicas mais populares são o Wordscores e o Wordfish.
O Wordscores é um algoritmo supervisionado para estimar posições políticas. Nessa família de algoritmos, são apresentados ao computador alguns dados de entrada e as saídas esperadas. Chamamos esse conjunto de entradas e saídas de training set. A partir desse conjunto de informações o algoritmo “aprende” a classificar novos documentos, o conjunto do test set.
Para nosso exemplo, vamos usar manifestos das eleições federais alemãs de 2013 e 2017. Para as eleições de 2013, temos as avaliações médias de especialistas para os cinco principais partidos e prevemos as posições dos partidos nos manifestos de 2017.
Embora o Wordscores constitua um grande avanço na análise quantitativa de textos, ele não é livre de problemas.
O principal é o fato de ele depender fortemente da escolha dos textos de referência ( training set ). Em situações extremas é possível que, com a escolha diferente de textos de referência, um mesmo pesquisador encontre resultados diferentes para um mesmo conjunto de dados.
A segunda limitação é a possibilidade de as diferenças entre os textos estarem mais relacionadas com o estilo linguístico do autor do que com as posições políticas. Como todas as palavras adicionam a mesma quantidade de informação sobre o documento, temos que palavras politicamente relevantes em um contexto sejam igualmente ponderadas a palavras pouco informativas.
A segunda técnica mais popular para estimar posições políticas a partir de textos é o Wordfish (SLAPIN; PROKSCH, 2008). Ao contrário do Wordscores, esse é um algoritmo não supervisionado, pois não depende da escolha de textos de referência, ou seja, da construção de um training set. Dessa forma, diminui muito a chance de obtenção de resultados diferentes a partir do mesmo conjunto de dados em razão da amostra de treinamento.
Vamos novamente usar um exemplo do pacote quanteda. Nesse exemplo, serão utilzados os os discursos orçamentários irlandeses de 2010.
A limitação desse modelo é o fato de ele necessitar que os documentos cubram uma grande quantidade de temas para extrair as posições ideológicas. Assim, se os parlamentares focarem seus discursos em determinadas áreas temáticas, provavelmente não teremos resultados consistentes ao aplicarmos o Wordfish. Como a variação no uso das palavras não será determinada pelas preferências políticas, mas pelos tópicos, a diferença nas posições estimadas também refletirá essa diferença. Outro aspecto, compartilhado com o Wordscore, é a possível mudança nos resultados a depender do tratamento dado aos textos no pré-processamento.
A classificação automatizada organiza o acervo de documentos em categorias, sejam elas conhecidas ou não.
Ancorados na teoria, na experiência ou especialidade em determinado assunto pode-se desejar classificar um acervo de documentos em categorias já conhecidas.
Métodos de aprendizado supervisionado replicam a familiar tarefa de codificação manual, porém com enorme redução de custos e grande ganho de escala. Sua implementação pressupõe a classificação manual de uma amostra do acervo em um conjunto predeterminado de categorias. Essa amostra classificada, conhecida como conjunto de treinamento ou training set, é usada para treinar modelos estatísticos, cuja principal aplicação é a classificação do restante do acervo, conjunto de teste ou test set, nas categorias predeterminadas. Ao final da classificação, procedimentos de validação devem ser adotados para se averiguar a performance do modelo utilizado.
Não é difícil encontrar situações nas quais o conjunto de categorias não seja conhecido. Pode, por exemplo, ser do interesse de um pesquisador identificar quais tópicos são enfatizados pelos deputados federais nos discursos proferidos ao longo de legislaturas. Uma vez que a atividade do representante político se debruça sobre inúmeras esferas da sociedade e da vida, predeterminar categorias temáticas de fala dos deputados federais pode limitar o conhecimento a ser obtido sobre o acervo. Para enfrentar esse desafio, veremos exemplos de aplicação do aprendizado não supervisionado (unsupervised learning methods).
Os modelos de tópicos possuem duas principais características:
O texto como dado: desafios e oportunidades para as ciências sociais
Como apontam Grimmer e Stewart (2013), todos os métodos de aprendizagem supervisionada pressupõem duas etapas básicas após os procedimentos de pré-processamento:
1. Definindo o número \(k\) de categorias
2. Validação: Um exemplo de aplicação desses dois tópicos será visto na apresentação do Expressed Agenda Model.
O Latent Dirichlet Allocation (LDA) (BLEI; NG; JORDAN, 2003) é um método popular Probabilistic Topic Models para modelagem de tópicos. Ele trata cada documento como uma mistura de tópicos e cada tópico como uma mistura de palavras. Isso permite que os documentos “se sobreponham” uns aos outros em termos de conteúdo, em vez de serem separados em grupos distintos.
Para aplicação do LDA, faremos uso do pacote topicmodels, que implementa o modelo desenvolvido por BLEI, NG e JORDAN (2003) através de um exemplo do pacote quanteda.
Vamos para o código.
As instruções da tarefa estão no arquivo NN-class-ds4ir-assignment.rmd da pasta assignment que se encontra na raiz desse projeto.